package Negocio;

import java.util.ArrayList;
import java.util.Collection;
import javax.persistence.*;
import DTO.CuentaCorrienteVO;
import SRV.CuentaCorrienteSRV;
import SRV.FacturaSRV;
import SRV.ReciboSRV;

@Entity
@Table(name="cuentasCorrientes")
public class CuentaCorriente 
{
	@Id
	@Column (name="numeroCuenta")
	private String numeroCuenta;
	@Column (name="saldo")
	private float saldo;
	@Column (name="saldoMinimo")
	private float saldoMinimo;
	@Column (name="limiteCredito")
	private float limiteCredito;
	@Column (name="formaDePago")
	private String formaDePago;

	@OneToMany (fetch = FetchType.EAGER)
	@JoinColumn(name="numeroCuenta")
	private Collection<Factura> facturas;
	
	@OneToMany
	@JoinColumn(name="numeroCuenta")
	private Collection<Recibo> recibos;
	
	
	public CuentaCorriente(String numeroCuenta, float saldo, float saldoMinimo, float limiteCredito, String formaDePago) 
	{
		super();
		this.numeroCuenta = numeroCuenta;
		this.saldo = saldo;
		this.saldoMinimo = saldoMinimo;
		this.limiteCredito = limiteCredito;
		this.formaDePago = formaDePago;
		this.facturas = new ArrayList<Factura>();
		this.recibos = new ArrayList<Recibo>();
	}
	
	public CuentaCorriente() {}

	public CuentaCorriente toBusiness(CuentaCorrienteVO cuenta)
	{
	    CuentaCorriente devuelto = new CuentaCorriente(cuenta.getNumeroCuenta(), getSaldo(), getSaldoMinimo(), 
		    getLimiteCredito(), getFormaDePago()); 
	    
	    Factura factura = new Factura();
	    FacturaSRV daoFac = new FacturaSRV();
	    for (Integer auxId : cuenta.getFacturas())
	    {
	    	factura = daoFac.getFactura(auxId);
	    	devuelto.agregarFactura(factura);
	    }
	    
	    Recibo recibo = new Recibo();
	    ReciboSRV daoRec = new ReciboSRV();
	    
	    for (Integer auxIdRec : cuenta.getRecibos())
	    {
	    	recibo = daoRec.getRecibo(auxIdRec);
			devuelto.agregarRecibo(recibo);
		}
	    
	    return devuelto;
	}
	
	public void agregarRecibo(Recibo recibo)
	{
		if (recibos != null){
			if (!tenesEsteRecibo(recibo))
					recibos.add(recibo);
		}
	}

	public boolean tenesEsteRecibo(Recibo recibo) 
	{
		CuentaCorrienteSRV daocc = new CuentaCorrienteSRV();
		CuentaCorriente buscada = daocc.getCuentaCorriente(this.getNumeroCuenta());
		
		for(Recibo aux : buscada.getRecibos())
		{
			if(aux.sosElRecibo(recibo.getIdRecibo()))
			{
				return true;
			}
		}
		return false;
	}

	public String getNumeroCuenta() {
		return numeroCuenta;
	}
	public void setNumeroCuenta(String numeroCuenta) {
		this.numeroCuenta = numeroCuenta;
	}
	public float getSaldo() {
		return saldo;
	}
	public void setSaldo(float saldo) {
		this.saldo = saldo;
	}
	public float getSaldoMinimo() {
		return saldoMinimo;
	}
	public void setSaldoMinimo(float saldoMinimo) {
		this.saldoMinimo = saldoMinimo;
	}
	public float getLimiteCredito() {
		return limiteCredito;
	}
	public void setLimiteCredito(float limiteCredito) {
		this.limiteCredito = limiteCredito;
	}
	public String getFormaDePago() {
		return formaDePago;
	}
	public void setFormaDePago(String formaDePago) {
		this.formaDePago = formaDePago;
	}
	public Collection<Factura> getFacturas() {
		return  facturas;
	}
	public void setFacturas(ArrayList<Factura> facturas) {
		this.facturas = facturas;
	}


	public void agregarFactura(Factura factura){
		if (!tenesEstaFactura(factura)){
			facturas.add(factura);
			this.saldo = this.saldo - factura.getTotal();
		}
	}
	
	public boolean tenesEstaFactura(Factura factura){
		if (facturas != null || facturas.size() > 0 ){
			for(Factura aux : facturas){
				if(aux.sosLaFactura(factura.getIdFactura())){
					return true;
				}
			}
		}

		return false;
	}
	
	public boolean sosLaCuentaCorriente(CuentaCorriente cuenta){
		if (this.getNumeroCuenta() == cuenta.getNumeroCuenta())
			return true;
		return false;
	}
	
	public Collection<Recibo> getRecibos() 
	{
		return recibos;
	}

	public void setRecibos(ArrayList<Recibo> recibos) {
		this.recibos = recibos;
	}

	public void setFacturas(Collection<Factura> facturas) {
		this.facturas = facturas;
	}

	public CuentaCorrienteVO toVO()
	{
		ArrayList<Integer> facturasVO = new ArrayList<Integer>();
		for (Factura fact : facturas)
		{
			facturasVO.add(fact.getIdFactura());
		}
		
		ArrayList<Integer> recibosVO = new ArrayList<Integer>();
		for (Recibo rec : recibos)
		{
			recibosVO.add(rec.getIdRecibo());
		}
		
		CuentaCorrienteVO auxVO = new CuentaCorrienteVO(this.numeroCuenta, this.saldo, this.saldoMinimo, this.limiteCredito, this.formaDePago, facturasVO, recibosVO);
		return auxVO;
	}
	
	public Factura buscarFactura(int numero)
	{
		for (Factura fact : this.facturas)
		{
			if (fact.sosLaFactura(numero))
				return fact;
		}
		
		return null;
	}
	
	public Recibo buscarRecibo(int numero)
	{
		for (Recibo rec : this.recibos)
		{
			if (rec.sosElRecibo(numero))
				return rec;
		}
		return null;
	}
	
/*	public CuentaCorriente(CuentaCorriente_Entity a){
		//FALTA EL TEMA DE LAS FACTURAS Y LOS RECIBOS
		//HAY QUE CREAR EL CONSTRUTOR PARA LAS ENTITIES!
		super();
		this.numeroCuenta = a.getNumeroCuenta();
		this.saldo = a.getSaldo();
		this.saldoMinimo = a.getSaldoMinimo();
		this.limiteCredito = a.getLimiteCredito();
		this.formaDePago = a.getFormaDePago();	
	}*/
	
}
